/*************************************************
  * 描述：日期时间选择器私有类
  *
  * File：cxidatetimepicker_p.h
  * Author：dongyao@mozihealthcare.cn
  * Date：2025/10/14
  * Update：
  * ************************************************/

#ifndef CXIDATETIMEPICKER_P_H
#define CXIDATETIMEPICKER_P_H

#include <QHBoxLayout>
#include <QPushButton>
#include <controls/datetimepicker/cxidatetimepicker.h>
#include <optional>
#include <private/datetimepicker/cxicalendarwidget.h>
class CxiDateTimePickerPrivate : public QObject
{
	Q_OBJECT
	Q_DISABLE_COPY(CxiDateTimePickerPrivate)
	Q_DECLARE_PUBLIC(CxiDateTimePicker)
public:
	explicit CxiDateTimePickerPrivate(CxiDateTimePicker* p);
	~CxiDateTimePickerPrivate() override;

	// 事件处理（接收公有类转发的事件）
	void handleMousePressEvent(QMouseEvent* event);
	void handleWheelEvent(QWheelEvent* event);
	bool handleKeyPressEvent(QKeyEvent* event);

	// 对外接口的实现
	void setDisplayFormat(const QString& format);
	bool calendarPopup() const;
	void setCalendarPopup(bool enable);
	void setDateTime(const std::optional<QDateTime>& dateTime);
	std::optional<QDateTime> dateTime() const;

private slots:
	// 验证输入有效性（editingFinished信号触发）
	void validateInput();
	// 按钮点击（显示/隐藏日历）
	void onDropDownButtonClicked();
	// 日历选中日期（同步到LineEdit）
	void onCalendarDateSelected(const QDateTime& date);

private:
	// 日期时间分段结构体（存储单个分段的信息）
	struct Section
	{
		CxiDateTimePicker::DateTimeSection type;// 分段类型（年/月/日等）
		int start;                              // 分段在文本中的起始索引
		int length;                             // 分段长度（如年份4位、月份2位）
		int value;                              // 分段当前值
	};
	void init();
	// 初始化下拉按钮（设置图标、样式、布局）
	void initDropDownButton();
	// 初始化日历弹窗（设置样式、位置、选中事件）
	void initCalendarWidget();
	// 计算日历弹窗的显示位置（对齐LineEdit底部）
	QRect calculateCalendarRect();

	// 矫正format为合法的格式
	QString sanitizeFormat(const QString& format);

	// 解析格式字符串，拆分出日期时间分段（如"yyyy-MM-dd"拆分为年/月/日）
	void parseSections();

	// 添加分段到列表
	void addSection(CxiDateTimePicker::DateTimeSection type, int start, int length);

	// 从分段列表更新显示文本（将分段值拼合成完整字符串）
	void updateTextFromSections();

	// 从当前显示文本同步分段值（处理手动输入后的同步）
	void updateSectionsFromText();

	// 根据光标位置判断当前选中的分段
	CxiDateTimePicker::DateTimeSection sectionAtCursor();

	// 选中当前分段的文本（鼠标点击后高亮分段）
	void selectCurrentSection();

	// 调整分段值（处理滚轮事件的增减逻辑）
	void adjustSectionValue(CxiDateTimePicker::DateTimeSection section, int delta);

	// 获取指定分段的当前值
	int getSectionValue(CxiDateTimePicker::DateTimeSection section);

	// 移动到下一个或上一个分段
	void moveToNextSection();
	void moveToPreviousSection();
	CxiDateTimePicker* q_ptr;
	// 私有成员变量
	QString m_format;                                   // 显示格式（如"yyyy-MM-dd HH:mm"）
	QList<Section> m_sections;                          // 所有日期时间分段
	CxiDateTimePicker::DateTimeSection m_currentSection;// 当前选中的分段
	QString m_validText;                                // 最后一次有效的文本（用于输入错误时恢复）

	QPushButton* m_dropDownBtn;         // 右侧下拉按钮
	CxiCalendarWidget* m_calendarWidget;// 日历弹窗
	bool m_calendarPopupEnabled;        // 日历弹窗启用状态
	QHBoxLayout* m_mainLayout;          // 主布局（LineEdit+按钮）
};


#endif//CXIDATETIMEPICKER_P_H
